module x7seg(
    input [15:0] x,        // 输入16位数字（x[3:0]显示第一个数码管，x[7:4]显示第二个，以此类推）
    input clk,             // 时钟信号
    input clr,             // 清零信号
    output reg [6:0] a_to_g,   // 七段数码管的控制信号
    output reg [3:0] an        // 片选信号，用于控制哪个数码管被选中
);

    wire [1:0] s;          // 选择显示的数码管位置
    reg [3:0] digit;
    reg [19:0] clkdiv;     // 用于分频

    assign s = clkdiv[4:3];  // 分频控制，决定选择哪个数码管

    always @(*) begin
        case (s)               // 根据选择的数码管显示对应的数字
            0: digit = x[3:0];  // 显示x[3:0]
            1: digit = x[7:4];  // 显示x[7:4]
            2: digit = x[11:8]; // 显示x[11:8]
            3: digit = x[15:12]; // 显示x[15:12]
            default: digit = x[3:0];
        endcase
    end

    always @(*) begin         // 段译码
        case (digit)
            4'b0000: a_to_g = 7'b1111110;  // 显示0
            4'b0001: a_to_g = 7'b0110000;  // 显示1
            4'b0010: a_to_g = 7'b1101101;  // 显示2
            4'b0011: a_to_g = 7'b1111001;  // 显示3
            4'b0100: a_to_g = 7'b0110011;  // 显示4
            4'b0101: a_to_g = 7'b1011011;  // 显示5
            4'b0110: a_to_g = 7'b1011111;  // 显示6
            4'b0111: a_to_g = 7'b1110000;  // 显示7
            4'b1000: a_to_g = 7'b1111111;  // 显示8
            4'b1001: a_to_g = 7'b1111011;  // 显示9
            4'hA:   a_to_g = 7'b1110111;  // 显示A
            4'hB:   a_to_g = 7'b0011111;  // 显示B
            4'hC:   a_to_g = 7'b1001110;  // 显示C
            4'hD:   a_to_g = 7'b0111101;  // 显示D
            4'hE:   a_to_g = 7'b1001111;  // 显示E
            4'hF:   a_to_g = 7'b1000111;  // 显示F
            default: a_to_g = 7'b1111110;  // 默认显示0
        endcase
    end

    always @(*) begin
        an = 4'b1111;         // 默认所有数码管都不选中
        if (clr == 1) begin
            an[s] = 0;         // 低电平有效，选择当前数码管
        end
    end

    always @(posedge clk or posedge clr) begin    // 时钟分频
        if (clr == 1) begin
            clkdiv <= 0;         // 清零
        end else begin
            clkdiv <= clkdiv + 1;  // 递增
        end
    end

endmodule
